#include "history.h"
#include "stdio.h"
#include "string.h"
#include "shell.h"
#include "console.h"

#define QUANTITY	100

typedef struct historyCDT{
	unsigned long int cant; //cantidad de lineas guardadas
	char comandos[QUANTITY][SHELL_CMD_BUFFER_SIZE]; //comandos cuardados
	unsigned long int first; //comando mas viejo guardado
	unsigned long int actual; //comando en el que esta actualmente recorriendo con las flechas
	unsigned long int last; //ultimo comando guardado
} historyCDT;

historyCDT myhistorys[CONSOLES_COUNT];
int startedhistorys[CONSOLES_COUNT] = {0};

void
newHistory(int cons)
{
	int i, j;

	if(cons > CONSOLES_COUNT || cons < 0 || startedhistorys[cons]==1)
		return;

	myhistorys[cons].cant = 0;
	myhistorys[cons].first = 0;
	myhistorys[cons].actual = 0;
	myhistorys[cons].last = 0;

	for(i=0; i<QUANTITY; i++)
		for(j=0; j<SHELL_CMD_BUFFER_SIZE; j++)
			myhistorys[cons].comandos[i][j] = 0;

	startedhistorys[cons] = 1;

	return;
}

void
addToHistory(int cons, char * string)
{
	if(cons > CONSOLES_COUNT || cons < 0 || startedhistorys[cons] == 0 || strcmp(string, NOTHING)==0)
		return;

	strncpy(myhistorys[cons].comandos[myhistorys[cons].cant], string, SHELL_CMD_BUFFER_SIZE-1);

	myhistorys[cons].cant = (myhistorys[cons].cant + 1) % (QUANTITY);
	myhistorys[cons].last = (myhistorys[cons].last + 1) % (QUANTITY);
	myhistorys[cons].actual = myhistorys[cons].last;
	if(myhistorys[cons].last == myhistorys[cons].first)
		myhistorys[cons].first = (myhistorys[cons].first + 1) % (QUANTITY);

	return;
}


char *
flechaParaArriba(int cons)
{
	if(cons > CONSOLES_COUNT || cons < 0 || startedhistorys[cons] == 0)
		return NULL;

	if(myhistorys[cons].actual == myhistorys[cons].first)
	{
		return myhistorys[cons].comandos[myhistorys[cons].actual];
	}
	else
	{
		myhistorys[cons].actual = (myhistorys[cons].actual - 1) % (QUANTITY);
		return myhistorys[cons].comandos[(myhistorys[cons].actual)% (QUANTITY)];
	}
}


char *
flechaParaAbajo(int cons)
{
	if(cons > CONSOLES_COUNT || cons < 0 || startedhistorys[cons] == 0)
		return NULL;

	if(myhistorys[cons].actual == myhistorys[cons].first)
	{
		myhistorys[cons].actual = (myhistorys[cons].actual+1) % (QUANTITY);
		return myhistorys[cons].comandos[myhistorys[cons].actual];
	}
	else if(myhistorys[cons].actual == myhistorys[cons].last)
	{
		return NOTHING; //aca iria lo que hay escrito
	}
	else
	{
		myhistorys[cons].actual = (myhistorys[cons].actual+1) % (QUANTITY);
		return myhistorys[cons].comandos[myhistorys[cons].actual];
	}
}



